/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controlacciones.ejb3.dao;

import controlacciones.ejb3.dao.entity.TbAccionFacadeLocal;
import controlacciones.ejb3.dao.entity.TbClienteFacadeLocal;
import controlacciones.ejb3.dao.entity.TbGrupoAccionFacadeLocal;
import controlacciones.ejb3.dao.entity.TbResultadoFacadeLocal;
import controlacciones.ejb3.dao.entity.TbTipoEjecucionFacadeLocal;
import controlacciones.ejb3.dao.entity.TbTipoObservacionFacadeLocal;
import controlacciones.ejb3.entity.TbAccion;
import controlacciones.ejb3.entity.TbArea;
import controlacciones.ejb3.entity.TbCliente;
import controlacciones.ejb3.entity.TbGrupoAccion;
import controlacciones.ejb3.entity.TbResultado;
import controlacciones.ejb3.entity.TbTipoAccionClasificacionAccionArea;
import controlacciones.ejb3.entity.TbTipoEjecucion;
import controlacciones.ejb3.entity.TbTipoObservacion;
import helper.Utiles_Fecha;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.sql.DataSource;

/**
 *
 * @author Vanessa
 */
@Stateless
public class RegistrarAccionDAOBean implements RegistrarAccionDAOLocal {


    @PostConstruct
    public void inicializaBean(){
        em = emf.createEntityManager();
    }

    @PreDestroy
    public void finalizaBean(){
        em.close();
    }

    public String procesarResultadoAcciones( String cod_area, String log_user ) throws Exception{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spProcesarResultados( ?, ?, ? ) }");
            cs.setString(1, cod_area);
            cs.setString(2, log_user);
            cs.registerOutParameter(3, java.sql.Types.VARCHAR);
            cs.execute();
            ban = cs.getString(3);
        } catch (SQLException ex) {
            ban = ex.getMessage();
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

    public String  procesarCargaTrabajoFecha_DBF( String fecha, TbArea area ) throws SQLException{
        String ban = "";
        try {            
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call sp_generarCargaTrabajo_DBF( ?, ?, ? ) }");
            cs.setString(1, fecha);
            cs.setString(2, area.getCodArea());
            cs.registerOutParameter(3, java.sql.Types.VARCHAR);
            cs.execute();
            ban = cs.getString(3);
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

   public String  ejecutaIntegracionResultados( String cod_area) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spEjecutarIntegracionResultados(?,?) }");
            cs.setString(1, cod_area );
            cs.registerOutParameter(2 , java.sql.Types.VARCHAR );
            cs.execute();
            ban = cs.getString( 2 );
            cs.close();
            cn.close();
        } catch (SQLException ex) {
            ban = ex.getMessage();
            //Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            //throw ex;
        }
        System.out.println( "spEjecutarIntegracionResultados: " + ban );
        return ban;
    }

   public String  ejecutaIntegracionLecturas( ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spEjecutarIntegracionLecturas(?) }");
            cs.registerOutParameter(1 , java.sql.Types.VARCHAR );
            cs.execute();
            ban = cs.getString(1);
            cs.close();
            cn.close();
        } catch (SQLException ex) {
            ban = ex.getMessage();
            //Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            //throw ex;
        }
        System.out.println( "spEjecutarIntegracionLecturas: " + ban );
        return ban;
    }

   public String  procesarlecturas( String cod_area, String fecProceso, String log_user, String obser  ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spProcesarLecturas(?,?,?,?,?) }");
            cs.setString(1, cod_area);
            cs.setString(2, fecProceso);
            cs.setString(3, log_user);
            cs.setString(4, obser);
            cs.registerOutParameter(5, java.sql.Types.VARCHAR);
            cs.execute();
            ban =cs.getString(5);
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

    public String  ejecutaIntegracionFacturas( ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spEjecutarIntegracionFacturas(?) }");
            cs.registerOutParameter(1 , java.sql.Types.VARCHAR );
            cs.execute();
            ban = cs.getString(1);
            cs.close();
            cn.close();
        } catch (SQLException ex) {
            ban = ex.getMessage();
            //Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            //throw ex;
        }
        System.out.println( "ejecutaIntegracionFacturas: " + ban );
        return ban;
    }

    public String  ejecutaCopiaFacturas(String fechaProceso, String log_user ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spCopiarFacturas(?,?,?) }");
            cs.setString(1, fechaProceso);
            cs.setString(2, log_user);
            cs.registerOutParameter(3 , java.sql.Types.VARCHAR );
            cs.execute();
            ban = cs.getString(3);
            cs.close();
            cn.close();
        } catch (SQLException ex) {
            ban = ex.getMessage();
            //Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            //throw ex;
        }
        System.out.println( "ejecutaCopiaFacturas: " + ban );
        return ban;
    }

    public String  procesarFacturas( String cod_area, String fecProceso, String log_user, String obser  ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spProcesarFacturas(?,?,?,?,?) }");
            cs.setString(1, cod_area);
            cs.setString(2, fecProceso);
            cs.setString(3, log_user);
            cs.setString(4, obser);
            cs.registerOutParameter(5, java.sql.Types.VARCHAR);
            cs.execute();
            ban =cs.getString(5);
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

    public String  ejecutaIntegracionReaperturas( ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spEjecutarIntegracionReaperturas(?) }");
            cs.registerOutParameter(1 , java.sql.Types.VARCHAR );
            cs.execute();
            ban = cs.getString(1);
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            ban = ex.getMessage();
            //Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            //throw ex;
        }
        return ban;
    }

    public String  copiarReaperturas( String fecProceso, String log_user) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spCopiarReaperturas(?, ?) }");
            cs.setString(1, fecProceso);
            cs.setString(2, log_user);
            cs.execute();
            ban = "bien";
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

    public String  procesarReaperturas( String cod_area, String fecProceso, String log_user, String obser  ) throws SQLException{
        String ban = "";
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call spProcesarReaperturas(?,?,?,?) }");
            cs.setString(1, cod_area);
            cs.setString(2, fecProceso);
            cs.setString(3, log_user);
            cs.setString(4, obser);
            cs.execute();
            ban = "bien";
            cn.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return ban;
    }

    public void registraAccionMasiva( List<TbCliente> clientes, TbTipoAccionClasificacionAccionArea tipoAccionClasificacionAccionArea, String observacion, String log_user ){
        TbAccion accion;
        boolean existe = false;
        accion = new TbAccion();
        accion.setCantidad(clientes.size());
        accion.setFechaRegistro(new Date());
        accion.setTbTipoAccionClasificacionAccionArea(tipoAccionClasificacionAccionArea);
        accion.setObservacionRegistro(observacion);
        accion.setLogUser(log_user);
        
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            //tbAccionFacadeLocal.create(accion);
            em.persist(accion);
            TbCliente tbCliente;
            for (int i = 0; i < clientes.size(); i++) {
                existe = false;
                tbCliente = clientes.get(i);
                if(tbCliente.getNumInscrip() != null){
                    if(! tbCliente.getNumInscrip().equalsIgnoreCase("")){
                        existe = consultaDAOLocal.verificarExisteAccion(tbCliente.getNumInscrip(), tipoAccionClasificacionAccionArea.getTbTipoAccion().getCodTipoAccion().toString());
                    }
                }
                if( existe == false ){
                    tbCliente.setIdAccion(accion);
                    //tbClienteFacadeLocal.create(tbCliente);
                    em.persist(tbCliente);
                }
            }
            em.flush();
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        }
    }

    public void registraAccionIndividual( TbCliente cliente, TbTipoAccionClasificacionAccionArea tipoAccionClasificacionAccionArea, String observacion, String log_user ){
        TbAccion accion;
        accion = new TbAccion();
        accion.setCantidad(1);
        accion.setFechaRegistro(new Date());
        accion.setTbTipoAccionClasificacionAccionArea(tipoAccionClasificacionAccionArea);
        accion.setObservacionRegistro(observacion);
        accion.setLogUser(log_user);
        accion.setFlagAnulada(Boolean.FALSE);

        cliente.setIdAccion(accion);

        System.out.println("cliente:"+ cliente.getNombre());
        System.out.println("tipoAccionClasificacionAccionArea:"+tipoAccionClasificacionAccionArea.getTbTipoAccion());
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            em.persist(accion);
            em.persist(cliente);
            em.flush();
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        }
    }

    public void registraAccionCorteReapertura( List<TbCliente> clientes, TbTipoAccionClasificacionAccionArea tipoAccionClasificacionAccionArea, String observacion, String log_user ){
        TbGrupoAccion grupo = null;
        Date dfecha  = new Date();
        Utiles_Fecha uf =  new Utiles_Fecha(dfecha);
        String sfecha = uf.getMes() + ""  + uf.getAnio();

        TbGrupoAccion grupoTemp = tbGrupoAccionFacadeLocal.find(sfecha);

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            if (grupoTemp == null) {
                grupo = new TbGrupoAccion();
                grupo.setCodGrupoAccion(sfecha);
                em.persist(grupo);                
            }else{
                grupo = grupoTemp;
            }
            int tamanio = clientes.size();
            TbAccion accion;
            //Collection listaTemp;
            for (int i = 0; i < tamanio; i++) {
                System.out.println( "Creando accion y cliente" );
                //Asignamos valores a la acción
                accion = new TbAccion();
                accion.setObservacionRegistro(observacion);
                accion.setLogUser( log_user );
                accion.setCantidad(1);
                accion.setCodGrupoAccion(grupo);
                accion.setFechaRegistro(new Date());
                accion.setTbTipoAccionClasificacionAccionArea(tipoAccionClasificacionAccionArea);
                //Asignamos valores a cliente
                clientes.get(i).setIdAccion(accion);
                em.persist(accion);
                em.persist(clientes.get(i));                
            }
            em.flush();
            tx.commit();
            System.out.println( "Hace Commit" );
        } catch (Exception e){
            tx.rollback(); //Deshacemos toda la transaccion
            e.printStackTrace();
        }
    }

    public void registrarResultadoAcciones( List<TbResultado> resultados ) throws Exception{
        TbAccion accion;
        TbTipoEjecucion tipoEjecucion;
        TbTipoObservacion tipoObservacion;

        for( TbResultado obj : resultados ){
            accion = null;
            tipoEjecucion = null;
            tipoObservacion = null;

            accion = tbAccionFacadeLocal.find(obj.getIdAccion());
            tipoEjecucion = tbTipoEjecucionFacadeLocal.find(obj.getCodTipoEjecucion().getCodTipoEjecucion());
            tipoObservacion = tbTipoObservacionFacadeLocal.find(obj.getCodTipoObservacion().getCodTipoObservacion());

            if( accion == null ){
                throw new Exception( "No se encontró el código de acción asociado al resultado" + obj.getTbAccion().getIdAccion() );
            }

            if( tipoEjecucion == null ){
                throw new Exception( "No se encontró el código de Tipo de Ejecucion asociado al resultado" + obj.getTbAccion().getIdAccion() );
            }

            if( tipoObservacion == null ){
                throw new Exception( "No se encontró el código de Tipo de Observacion asociado al resultado" + obj.getTbAccion().getIdAccion() );
            }
        }
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Integer codigo = null;
            TbAccion accionBus = null;
            for (TbResultado obj : resultados) {
                accionBus = tbAccionFacadeLocal.find(obj.getIdAccion());
                if (accionBus != null) {
                    accionBus.setFechaAtencion(obj.getFechaEjecucion());
                    tbAccionFacadeLocal.edit(accionBus);
                }
                em.persist(obj);
            }
            em.flush();
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        }
    }

    public void procesarCargaTrabajoFecha( String fecha, TbArea area ) throws SQLException{
        try {
            Connection cn = this.dsComercial.getConnection();
            CallableStatement cs = cn.prepareCall("{ call sp_generarCargaTrabajo( ?, ? ) }");
            cs.setString(1, fecha);
            cs.setString(2, area.getCodArea());
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(RegistrarAccionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
    }

    public void generarMuestreo( String idAccion ){
        List<TbCliente> lista = null;
        String queryString = "select tc.* " +
                            "from tb_cliente tc " +
                            "where id_accion = '"+ idAccion +"'";

        lista = em.createNativeQuery( queryString, TbCliente.class )
                .getResultList();
    }

    public void actualizarAccion( TbAccion tbAccion ){
        tbAccionFacadeLocal.edit(tbAccion);
    }

    @EJB
    TbAccionFacadeLocal tbAccionFacadeLocal;
    @EJB
    TbClienteFacadeLocal tbClienteFacadeLocal;
    @EJB
    TbGrupoAccionFacadeLocal tbGrupoAccionFacadeLocal;
    @EJB
    TbResultadoFacadeLocal tbResultadoFacadeLocal;
    @EJB
    TbTipoObservacionFacadeLocal tbTipoObservacionFacadeLocal;
    @EJB
    TbTipoEjecucionFacadeLocal tbTipoEjecucionFacadeLocal;

    @EJB
    ConsultaDAOLocal consultaDAOLocal;

    @Resource(name="jdbc/Comercial")
    DataSource dsComercial;

    @PersistenceUnit(unitName="controlacciones-pu")
    EntityManagerFactory emf;
    
    EntityManager em;
}
